//主函数开始；
#include"../include/p.h"
int main(int argc, const char *argv[])

{
	//首先打开数据库  从登录注册进行判断该id是否存在
	//char buff[20]={0};
	sqlite3 *mydb=NULL;
	mydb=sql_Open("user.db");
	//创建表 usermsg
	create_tb(mydb,"usermsg");
	char tbname[20]={0};
	strcpy(tbname,"usermsg");
	printf("%s\n",tbname);
	if(argc<3)
	{
		printf("please input appname ip port\n");
		return -1;
	}
	//1.调用tcp_server监听是否有人连接
	int listenfd=0;
	listenfd=tcp_server(argv[1],atoi(argv[2]));
	//2.接收连接
	int newfd=0;
	//不获得对方的地址
	//newfd=accept(listenfd,NULL,NULL);
	//获得客户端的地址
	struct sockaddr_in client;
	bzero(&client,sizeof(client));
	//io多路复用
	//1-1.创建一个有关文件描述符的表
	fd_set readfds,temp;
	//1-2.将该表中所有位置为0
	FD_ZERO(&readfds);
	FD_ZERO(&temp);
	//1-3.将监听socket加入该表中
	FD_SET(listenfd,&readfds);

	while(1)
	{
		//1-4. 阻塞监控该表
		temp=readfds;
		select(FD_SETSIZE,&temp,NULL,NULL,NULL);
		//1-5.该监控队列中有文件描述符有数据 ，遍历
		int i=0;
		for(i=0;i<FD_SETSIZE;i++)
		{
			//1-6.判断哪个文件描述符有数据
			if(FD_ISSET(i,&temp))
			{
				if(i==listenfd)
				{
					bzero(&client,sizeof(client));
					unsigned int len=sizeof(client);
					//当连接成功的那瞬间，将客户端的信息保存到该地址上.
					newfd=accept(listenfd,(struct sockaddr *)&client,&len);
					if(newfd<0)
					{
						perror("accept error");
						return -1;
					}
					printf("accept ok ip=%s port=%d\n",inet_ntoa(client.sin_addr),ntohs(client.sin_port));
					FD_SET(newfd,&readfds); //将新生成的socket加入到监控队列中
				}
				else //通信socket有数据，跟客户端进行通信
				{	
					///从这里进行注册登录判断
					while(1)
					{
						int m=tcp_newcom(newfd,mydb,tbname);
						if(m<0)
						{
							printf("newcom error \n");
							//close(listenfd);
							//return -1;
							close(i);
							FD_CLR(i,&readfds);
							return-1;
						}
						if(m==2)
						{
							printf("newcom正常退出\n");
							break;
						}
						
					}
					//在函数中 显示登录或注册成功
					//；
					//成功可以增删改查
					//
					//
					//对数据库操作完之后再进行文件下载
					int res1=db_zsgc(mydb,newfd);
					if(res1<0)
					{
						printf("zsgc error\b ");
						close(listenfd);
						return -1;
					}
					//3.跟客户端进行通信
					printf("客户进入正常通信阶段 \n");
					while(1)
					{
						int n=tcp_com(newfd);
						if(n<0)
						{
							printf("通信结束\n");
							close(newfd);
							break;
						}
					}
				}
			}
		}
	}
	//4.关闭socket对象
	close(listenfd);
	return 0;
}
